package org.feng.util;

import org.springframework.util.StringUtils;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAccessor;

/**
 * 时间工具类
 *
 * @version V1.0
 * @date: 2022年02月17日 11时38分
 */
public abstract class TimeUtil {

    /**
     * 默认使用系统当前时区
     */
    private static final ZoneId ZONE = ZoneId.systemDefault();

    private static final DateTimeFormatter DATETIME_FORMATTER = DateTimeFormatter.ofPattern(TimeFormatPatternEnum.DATETIME_FORMAT_PATTERN.toString());

    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern(TimeFormatPatternEnum.DATE_FORMAT_PATTERN.toString());

    private static final DateTimeFormatter DATETIME_ZONE_FORMATTER = DateTimeFormatter.ofPattern(TimeFormatPatternEnum.DATETIME_ZONE_FORMAT_PATTERN.toString());

    /**
     * String 转 LocalDateTime
     *
     * @param stringDateTime 时间字符串，格式为yyyy-MM-dd HH:mm:ss的字符串
     * @return LocalDateTime 实例
     */
    public static LocalDateTime stringToLocateDateTime(String stringDateTime) {
        if (!StringUtils.hasLength(stringDateTime)) {
            return null;
        }
        return LocalDateTime.parse(stringDateTime, DATETIME_FORMATTER);
    }

    public static String defaultFormat(TemporalAccessor temporalAccessor) {
        return DATETIME_FORMATTER.format(temporalAccessor);
    }


    /**
     * 将time时间(格式为yyyy-MM-dd HH:mm:ss)转换成毫秒时间戳
     *
     * @param time string
     * @return 毫秒时间戳
     */
    public static Long stringDateToMilli(String time) {
        return LocalDateTime.parse(time, DATETIME_FORMATTER).atZone(ZONE).toInstant().toEpochMilli();
    }

    /**
     * 获取时间戳秒
     *
     * @param localDateTime 日期时间
     * @return 时间戳秒
     */
    public static Long locateTimeToSecond(LocalDateTime localDateTime) {
        return localDateTime.atZone(ZONE).toEpochSecond();
    }

    /**
     * 获取时间戳毫秒
     *
     * @param localDateTime 日期时间
     * @return 时间戳毫秒
     */
    public static Long locateTimeToMilli(LocalDateTime localDateTime) {
        return localDateTime.atZone(ZONE).toInstant().toEpochMilli();
    }

    /**
     * 时间格式枚举
     */
    public enum TimeFormatPatternEnum {
        /**
         * 时间格式枚举：年月日，年月日时分秒，年月日时分秒时区
         */
        DATE_FORMAT_PATTERN("yyyy-MM-dd"),
        DATETIME_FORMAT_PATTERN("yyyy-MM-dd HH:mm:ss"),
        DATETIME_ZONE_FORMAT_PATTERN("yyyy-MM-dd HH:mm:ssZ");

        private final String format;

        TimeFormatPatternEnum(String format) {
            this.format = format;
        }

        @Override
        public String toString() {
            return format;
        }
    }
}


